"""
配置管理模块
负责加载和管理系统配置文件
"""

import os
import yaml
from typing import Dict, Any, Optional
from pathlib import Path


class Config:
    """
    配置管理类
    
    功能：
    - 从YAML文件加载配置
    - 提供配置项的访问接口
    - 支持配置的动态更新
    - 配置验证和默认值处理
    """
    
    def __init__(self, config_path: str = "config.yaml"):
        """
        初始化配置管理器
        
        参数:
            config_path (str): 配置文件路径，默认为项目根目录的config.yaml
        """
        self.config_path = Path(config_path)
        self._config = {}
        self.load_config()
        
    def load_config(self) -> None:
        """
        从YAML文件加载配置
        
        异常:
            FileNotFoundError: 配置文件不存在
            yaml.YAMLError: YAML格式错误
        """
        if not self.config_path.exists():
            raise FileNotFoundError(f"配置文件不存在: {self.config_path}")
            
        try:
            with open(self.config_path, 'r', encoding='utf-8') as f:
                self._config = yaml.safe_load(f)
        except yaml.YAMLError as e:
            raise ValueError(f"配置文件格式错误: {e}")
            
    def get(self, key: str, default: Any = None) -> Any:
        """
        获取配置项的值
        
        参数:
            key (str): 配置项键名，支持点号分隔的多级键名（如 'model.detector.type'）
            default (Any): 默认值，当配置项不存在时返回
            
        返回:
            Any: 配置项的值
            
        示例:
            >>> config = Config()
            >>> config.get('system.log_level', 'INFO')
            'INFO'
        """
        keys = key.split('.')
        value = self._config
        
        for k in keys:
            if isinstance(value, dict) and k in value:
                value = value[k]
            else:
                return default
                
        return value
        
    def set(self, key: str, value: Any) -> None:
        """
        设置配置项的值（仅在内存中，不会保存到文件）
        
        参数:
            key (str): 配置项键名，支持点号分隔的多级键名
            value (Any): 要设置的值
        """
        keys = key.split('.')
        config = self._config
        
        for k in keys[:-1]:
            if k not in config:
                config[k] = {}
            config = config[k]
            
        config[keys[-1]] = value
        
    def save(self, path: Optional[str] = None) -> None:
        """
        保存配置到文件
        
        参数:
            path (str, optional): 保存路径，默认为原配置文件路径
        """
        save_path = path or self.config_path
        
        with open(save_path, 'w', encoding='utf-8') as f:
            yaml.dump(self._config, f, allow_unicode=True, default_flow_style=False)
            
    def get_all(self) -> Dict[str, Any]:
        """
        获取所有配置项
        
        返回:
            Dict[str, Any]: 完整的配置字典
        """
        return self._config.copy()
        
    def __getitem__(self, key: str) -> Any:
        """支持使用下标访问配置项"""
        return self.get(key)
        
    def __setitem__(self, key: str, value: Any) -> None:
        """支持使用下标设置配置项"""
        self.set(key, value) 